package com.gdust.hzx.cart.controller;

import com.gdust.hzx.cart.service.CartService;
import com.gdust.hzx.model.entity.h5.CartInfo;
import com.gdust.hzx.model.vo.common.Result;
import com.gdust.hzx.model.vo.common.ResultCodeEnum;
import com.gdust.spzx.common.log.annotation.Log;
import com.gdust.spzx.common.log.enums.OperatorType;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * ClassName: CartController
 * Package: com.gdust.hzx.cart.controller
 * Description: 购物车操作接口
 * 该类提供了与购物车相关的所有操作，包括添加商品、查询购物车、删除商品、更新选中状态等。
 *
 * @Author syun
 * @Create 2024/12/27 15:22
 * @Version 1.0
 */
@Tag(name = "购物车接口")// 用于 Swagger 文档生成，标记该控制器是购物车相关的接口
@RestController// @RestController: 专用于restful风格的注解 = @Controller (控制器) + @ResponseBody (方法返回值为json)
@RequestMapping("/api/order/cart") // 所有接口的基础路径，表示购物车相关的操作
public class CartController {
    /**
     * // 注入 CartService，用于处理具体的购物车业务逻辑
     */
    @Autowired
    private CartService cartService;

    /**
     * 添加商品到购物车
     *
     * 该方法通过 SKU ID 和商品数量将商品添加到购物车。通过 Redis 存储购物车数据。
     *
     * @param skuId 商品 SKU 的 ID
     * @param skuNum 商品数量
     * @return 返回操作结果
     */
    @Operation(summary = "添加购物车")
    @GetMapping("auth/addToCart/{skuId}/{skuNum}")
    @Log(title = "添加购物车",businessType = 1,operatorType = OperatorType.OTHER)
    public Result addToCart(@PathVariable Long skuId,
                            @PathVariable Integer skuNum){
        //自定义方法：添加购物车
        cartService.addToCart(skuId,skuNum);
        return Result.build(null,ResultCodeEnum.SUCCESS);
    }

    /**
     * 查询购物车列表
     *
     * 该方法返回当前用户购物车中的所有商品信息。
     *
     * @return 返回购物车商品列表
     */
    @Operation(summary = "查询购物车")
    @GetMapping("auth/cartList")
//    @Log(title = "查询购物车",businessType = 1,operatorType = OperatorType.MOBILE)
    public Result cartList(){
        //自定义方法查询：查询购物车
        List<CartInfo> cartInfoList = cartService.getCartList();
        return Result.build(cartInfoList,ResultCodeEnum.SUCCESS);
    }

    /**
     * 删除购物车中的商品
     *
     * 该方法根据 SKU ID 删除购物车中的商品。
     *
     * @param skuId 商品 SKU 的 ID
     * @return 返回操作结果
     */
    @Operation(summary = "删除购物车商品")
    @DeleteMapping("auth/deleteCart/{skuId}")
    @Log(title = "删除购物车商品",businessType = 3,operatorType = OperatorType.OTHER)
    public Result deleteCart(@PathVariable("skuId") Long skuId){
        //自定义方法：删除购物车商品
       cartService.deleteCart(skuId);
       return Result.build(null,ResultCodeEnum.SUCCESS);
    }


    /**
     * 更新购物车中商品的选中状态
     *
     * 该方法根据 SKU ID 更新购物车中指定商品的选中状态。
     *
     * @param skuId 商品 SKU 的 ID
     * @param isChecked 是否选中，1 表示选中，0 表示取消选中
     * @return 返回操作结果
     */
    @Operation(summary="更新购物车商品选中状态")
    @GetMapping("/auth/checkCart/{skuId}/{isChecked}")
    @Log(title = "更新购物车商品选中状态",businessType = 2,operatorType = OperatorType.OTHER)
    public Result checkCart(@Parameter(name = "skuId", description = "商品skuId", required = true) @PathVariable(value = "skuId") Long skuId,
                            @Parameter(name = "isChecked", description = "是否选中 1:选中 0:取消选中", required = true) @PathVariable(value = "isChecked") Integer isChecked) {
        //自定义方法：更新购物车商品选中状态
        cartService.checkCart(skuId,isChecked);
        return Result.build(null,ResultCodeEnum.SUCCESS);
    }

    /**
     * 更新购物车中所有商品的选中状态
     *
     * 该方法更新购物车中所有商品的选中状态，统一设置为选中或取消选中。
     *
     * @param isChecked 是否选中，1 表示选中，0 表示取消选中
     * @return 返回操作结果
     */
    @Operation(summary="更新购物车商品全部选中状态")
    @GetMapping("/auth/allCheckCart/{isChecked}")
    @Log(title = "更新购物车商品全部选中状态",businessType = 2,operatorType = OperatorType.OTHER)
    public Result allCheckCart(@Parameter(name = "isChecked", description = "是否选中 1:选中 0:取消选中", required = true) @PathVariable(value = "isChecked") Integer isChecked){
        //自定义方法：更新购物车商品全部选中状态
        cartService.allCheckCart(isChecked);
        return Result.build(null, ResultCodeEnum.SUCCESS);
    }


    /**
     * 清空购物车
     *
     * 该方法清空当前用户购物车中的所有商品。
     *
     * @return 返回操作结果
     */
    @Operation(summary = "清空购物车")
    @GetMapping("/auth/clearCart")
    @Log(title = "清空购物车",businessType = 3,operatorType = OperatorType.OTHER)
    public Result clearCart(){
        //自定义方法：清空购物车
        cartService.clearCart();
        return Result.build(null, ResultCodeEnum.SUCCESS);
    }

    /**
     * 获取当前登录用户选中的购物项列表数据
     * //远程调用：订单结算使用，获取购物车选中商品列表
     * @return
     */
    @Operation(summary="选中的购物车")
    @GetMapping(value = "/auth/getAllChecked")
    public List<CartInfo> getAllChecked() {
        //获取购物车选中商品列表
        List<CartInfo> list = cartService.getAllChecked();
        return list;
    }

    /**
     * 清空购物车接口
     * 需求说明：订单生成成功以后，需要调用service-cart微服务的接口清空选中的购物车数据。
     * 远程调用：删除生成订单的购物车商品
     * @return
     */
    @GetMapping("/auth/deleteChecked")
    public Result deleteChecked() {
        //自定义方法：删除生成订单的购物车商品
        cartService.deleteChecked();
        return Result.build(null, ResultCodeEnum.SUCCESS);
    }

}
